package iluminados.cine.pe.dao;

import java.sql.*;
import java.util.*;
import javax.sql.DataSource;

import org.apache.commons.logging.*;
import org.springframework.dao.*;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import iluminados.cine.pe.dao.interfaces.CategoriaDAOInt;
import iluminados.cine.pe.excepcion.DAOExcepcion;
import iluminados.cine.pe.model.Categoria;

public class CategoriaDAOImpl implements CategoriaDAOInt {

	protected Log log = LogFactory.getLog(getClass());

	private DataSource dataSource;

	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	@SuppressWarnings("unchecked")
	public List<Categoria> buscarPorNombre2(String nombre) throws DAOExcepcion {

		log.info("buscarPorNombre() : " + nombre);

		List<Categoria> arreglo = new ArrayList<Categoria>();
		try {
			arreglo = getHibernateTemplate().find(
					"from Categoria a where trim(a.nombre) like ?",
					"%" + nombre + "%");
		} catch (Exception e) {
			log.error(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
		return arreglo;
	}

	public Collection<Categoria> buscarPorNombre(String nombre)
			throws DAOExcepcion {
		String query = "select id_categoria, nombre, descripcion from categoria where nombre like ?";
		Collection<Categoria> lista = new ArrayList<Categoria>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = dataSource.getConnection();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Categoria vo = new Categoria();
				vo.setIdCategoria(rs.getInt("id_categoria"));
				vo.setNombre(rs.getString("nombre"));
				vo.setDescripcion(rs.getString("descripcion"));
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			try {
				rs.close();
				stmt.close();
				con.close();
			} catch (SQLException e) {
				throw new DAOExcepcion(e.getMessage());
			}
		}
		System.out.println(lista.size());
		return lista;
	}

	@SuppressWarnings("unchecked")
	public List<Categoria> listar() throws DAOExcepcion {
		log.info("listar()");
		List<Categoria> lista = new ArrayList<Categoria>();
		try {
			lista = getHibernateTemplate().find("from Categoria");
		} catch (DataAccessException e) {
			log.error(e.toString());
			throw new DAOExcepcion(e.getMessage());
		}
		return lista;
	}

	public Categoria obtener(int idCategoria) throws DAOExcepcion {
		log.info("obtener() : " + idCategoria);
		Categoria modelo = new Categoria();
		try {
			modelo = (Categoria) getHibernateTemplate().find(
					"from Categoria a where trim(a.idCategoria) = ?",
					idCategoria + "").get(0);
		} catch (Exception e) {
			log.error("Error: " + e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
		return modelo;
	}

	public Categoria actualizar(Categoria modelo) throws DAOExcepcion {
		try {
			getHibernateTemplate().update(modelo);
			getHibernateTemplate().flush();
		} catch (Exception e) {
			log.error(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
		return modelo;
	}

	public Categoria insertar(Categoria modelo) throws DAOExcepcion {
		try {
			getHibernateTemplate().save(modelo);
			getHibernateTemplate().flush();
		} catch (Exception e) {
			log.error(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
		return modelo;
	}

	public void eliminar(int idCategoria) throws DAOExcepcion {
		Categoria modelo = new Categoria();
		modelo.setIdCategoria(idCategoria);
		try {
			getHibernateTemplate().delete(modelo);
			getHibernateTemplate().flush();
		} catch (Exception e) {
			log.error(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
	}

}
